package com.orangelife.service.propFeeComputeRule.model;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Stack;

import com.orangelife.utils.StringUtils;

public class FormulaModal {
	
	public static void main(String[] args) {
		
		
		
		int i=0;
		i=i++;
		System.out.println(i*2);
		
		
		
		FormulaModal k=new FormulaModal("@@@SSS(@DDD,12,@@@pp(222,@pp))+@@@SSS(@DDD1_sdsd,2,12)");
		k.parseFormula();
	}
	
	private String formula;

	private  String name;
	/**
	 * 
	 * 需外部获取的参数
	 * */
	private  List<String> allparams=new ArrayList<>();
	
	/**
	 * 
	 * 需获取的参数
	 * */
	private  Map<String,String> params;
	

	/**
	 * ISelfFormula
	 * 自定义公式
	 * */
    private Stack<ISelfFormula> formulas;
	

	/**
	 * 该公式是否有效 0为未校验，-1无效，1有效
	 *
	 * */
    private int isValid=0;
	/**
	 * 该公式是否有效 0为未校验，-1无效，1有效
	 *
	 * */
    private String  errInfo;
	public FormulaModal(String formula){
		this.formula=formula;
		
		
		
	}
	
	public void parseFormula(String Formula){
		
		
		this.setFormula(Formula);
	
		
	}
	
	public String getResult(){
		
		return null;
	}
	
	
	/**
	 * 
	 * 无嵌套子公式解析
	 * */
	
	public void parseFormulaSimple(){
		
	if(StringUtils.isBlank(this.formula)){
			
			this.isValid=-1;
			this.errInfo="公式为空";
			return ;
		}
		
		int n=this.formula.indexOf("(");
		int m=this.formula.indexOf(")");
		//String name="";
		//String method="";
		//method=this.formula.substring(0,n);
		//int i=method.indexOf(".");
		//if(i!=-1){
			
			//name=method.substring(i);
		//	method=method.substring(0,i);
		//}
		
	//	formulas.add(this.getSelfFormula(name,method));
		
		
		String mm=this.formula.substring(n+1,m);
		
		String [] pa=mm.split(",");
		
		for (String string : pa) {
			if(string.indexOf("@")!=-1){
				
				allparams.add(string);
				params.put(string, null);
			}
		}
		
	}
	
	/**
	 * 
	 * 匹配公式,包含公式类初始化参数 （批量计算时的缓存），和计算参数
	 * */
	
	public ISelfFormula  getSelfFormula(String name,String method){
		
		if(StringUtils.isBlank(name)){
			
			name="commSelfFormula";
		};
		
		
		switch (name) {
		case "radio":
			
			ISelfFormula r=	new Ratio();
			
		 return r; 
		

		default:
			break;
		}
		
		return null;
	}

	/**
	 * 
	 * 解析公式（）
	 * */
	public void parseFormula(){
     
		if(StringUtils.isBlank(this.formula)){
			
			this.isValid=-1;
			this.errInfo="公式为空";
			return ;
		}
		
		
		System.out.println(this.formula);
		
		
	    int level=1;
		StringBuffer ss=new StringBuffer(); 
		int len=0;
		for (int i=0; i< this.formula.length(); i++) {
			char c=this.formula.charAt(i);
	        if(c=='@'){
	        	ss.append(c); 
	        	len++;
            }
	        else{
	        	/**
	        	 * 
	        	 * 说明是方法或者是参数
	        	 * */
	            if(ss.length()>0){
	            	if(this.checkIsOperator(c)){
	            		
	            		ss.append(c);	
	            		
	            	}
	            	else{
	            		if(len==3){
	            			
	            			System.out.println("方法名:"+ss.toString());
	            			
	            			/**
	            			 * 
	            			 * 参数解析
	            			 * 
	            			 * */
	            			if(c!='('){
	            				System.out.println("公式错误");
	            				break;
	            			}
	            			
	            			int ll=this.parseSub(this.formula, i,level);	            				            			
	            			System.out.println("公式为"+ss.toString()+this.formula.substring(i, ll+1));	
	            		
	            			
	            		}else{
	            			
	            			System.out.println("参数名:"+ss.toString());
	            		}
	            	
	            		len=0;
	            		ss.setLength(0);
	            	}
	            	
	            	
	            }
	            
	            
	            
	        	
	        	
	        }
	        
	        
			
			
		}
		
	
			
		
		
//		for (int i = 0; i<this.formula.length(); i++) {
//			
//			
//			char c=this.formula.charAt(i);
//			
//			
//			
//		}
		
		
		
	    	
		
		
	}
	
	public int parseSub(String str,int n,int level){
		int left=0;
		int right=0;
		
		for(int i=n;i<str.length();i++){
	 char c=str.charAt(i);
	 
	 if(c=='('){
		 
		 left++;
		 
	 }
	 
	 else if(c==')'){
		 right++;
		 if(left==right){
			 
			 
			 
			 return i;
		 }
		 
	 }
			
			
			
		}
		
		
		return -1;
		
	}
	public boolean checkIsOperator(char c){
		
		boolean flag=false;
		switch (c) {
		case '+':		
			break;
		case '-':		
			break;
		case '*':		
			break;
		case '/':		
			break;
		case '(':		
			break;
		case ')':		
			break;	
		case ',':		
			break;	
		default:
			flag=true;
			break;
		}
		return flag;
		
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public List<String> getAllparams() {
		return allparams;
	}

	public void setAllparams(List<String> allparams) {
		this.allparams = allparams;
	}

	public Map<String,String> getParams() {
		return params;
	}

	public void setParams(Map<String,String> params) {
		this.params = params;
	}

	public String getFormula() {
		return formula;
	}

	public void setFormula(String formula) {
		this.formula = formula;
	}

	
	
}
